Dev - #217
Merged
Merged
Conversation
bug(cache setup): relase
bug(cache setup): add ttl + invalidation
fix(ci): fix ci divergent from local fix(test): fix test for python 3.12 feat(sdk): add reconnection via dial + redis==8 and x-task-id in grpc metadata feat(sdk): 1.0.0.dev19 / reco feat(sdk): 1.0.0.dev20 / reco feat(sdk): 1.0.0.dev21 / middleware permission feat(sdk): 1.0.0.dev22 / middleware permission & ecrets feat(sdk): 1.0.0.dev23 / associated task id feat(sdk): 1.0.0.dev23 / log associated task id feat(sdk): 1.0.0.dev25 / log associated task id release(beta): staging release
feat!: Redis-first task transport and minimal gateway surface
feat(manager): Add ToolKit manager to collapse all registry tool into 4 entry with many actions
fix(ci): fix ci divergent from local
fix(test): fix test for python 3.12
feat(sdk): add reconnection via dial + redis==8 and x-task-id in grpc metadata
feat(sdk): 1.0.0.dev19 / reco
feat(sdk): 1.0.0.dev20 / reco
feat(sdk): 1.0.0.dev21 / middleware permission
feat(sdk): 1.0.0.dev22 / middleware permission & ecrets
feat(sdk): 1.0.0.dev23 / associated task id
feat(sdk): 1.0.0.dev23 / log associated task id
feat(sdk): 1.0.0.dev25 / log associated task id
release(beta): staging release
feat(community): add ModuleToolkit to community.agno
One SDK toolkit instead of per-archetype copies.
Every tool call collapsed to "No successful response received from module".
Parses the sentinel protocol (stream.error → "[CODE] message"), plus image
extraction and AG-UI event relay. Adds agno optional extra.
feat(agno): introduce toolkits for chat history, user profile, and registry access
- Added `ChatHistoryTools`, `UserProfileTools`, and `RegistryTools` to enhance agent capabilities.
- Updated `pyproject.toml` to include the new optional dependency `agno`.
- Introduced new module structure for toolkits under `digitalkin.community.agno.toolkits`.
- Enhanced `ModuleServer` to include module type in initialization.
- Updated registry models to support new module types and setups.
- Improved error handling and logging in registry services.
feat(agno): introduce toolkits + storage visibility and cross-context read scopes
feat(agno): registry toolkit refactor — discriminated-action managers (DEV-686)
Collapse the many registry LLM tools into four uniform managers, each a single
agno tool taking one discriminated `action` union:
- tools_manager / services_manager / kins_manager — CRUD (get / search / update /
delete / change_visibility, plus create/load for services) over setups of each
module_type, sharing one action set and the guard/normalise plumbing;
- load_manager — external-execution manager that loads a discovered tool into the
agent (HITL pause + auto-continue) so it is callable in the same turn.
Design:
- Command pattern: each action is a Pydantic model with execute(ctx); shared
BaseAction/BaseActionCtx, per-family RegistryAction/LoadAction bases.
- Managers register with skip_entrypoint_processing + an explicit schema and
validate the argument themselves (accepting an object or a JSON string), so a
bad LLM argument returns a clean {error, metadata} envelope the model can
self-correct from instead of raising a validate_call traceback.
- Every result is the canonical {output|error, metadata:{success, tool}} envelope.
Hardening (from QA passes):
- type isolation: ensure_kind gates every id-targeting action to its manager's
kind (no cross-kind read/update/delete); writes on a deleted id are refused.
- load_manager returns distinct failures, catches registry NOT_FOUND, and never
raises into the agent loop; change_visibility re-reads the committed state.
- dynamic loading invalidates agno's tools cache before acontinue_run so a
freshly-loaded tool is re-resolved into the model's function map.
Removes the old registry.py / setup.py / tool_loader.py surfaces and their tests.
feat(agno): validate setup content against the module config schema (DEV-686)
Before kins_manager.update/create writes a setup version, compile a throwaway
Pydantic model from the module's config-setup JSON schema (fetched via
GetConfigSetupModule) and validate the content, so an LLM driving the toolkit
gets a correctable error instead of breaking the kin.
The validator mirrors the schema's own strictness rather than a loose superset:
- objects reject non-objects, recursively, resolving $ref/$defs (D5);
- undeclared keys are forbidden unless additionalProperties is true (D8);
- arrays type their elements via items (D9);
- enum/const become closed Literal choices (D10);
- a field is nullable only when the schema declares it (D11);
- scalars are validated in strict mode, no "2"->number / true->number coercion (D13);
- strings reject C0 control characters, e.g. NUL / ANSI escapes (D17);
- numeric bounds, string length/pattern and array minItems/maxItems are enforced
when declared (D14/D15/D16 close as soon as the module schema tightens them).
Wiring: CommunicationStrategy grows a get_module_config_schema (gRPC override
calls GetConfigSetupModule); ModuleContext exposes it; RegistryActionCtx runs
the validation best-effort (skipped when no context/schema is available).
Also: rename the archive action to delete, and carry the RegistrySetupStatus /
Visibility enums through SetupData with lenient _missing_ coercion.
feat(agno): type mapping values via additionalProperties in content validation (D18)
An object schema with no properties but an additionalProperties value schema
(e.g. a tool's `triggers`: {additionalProperties: {type: boolean}}) now compiles
to dict[str, <value>] instead of a bare dict, so a wrong-typed value (a string
where a boolean is expected) is refused with the field path. Also honour
minProperties/maxProperties as mapping cardinality bounds.
docs(agno): reword internal comments to drop private review references
feat(agno): reject control characters in a write action's name field
fix(agno): harden registry managers against QA-found defects (D3, D6, D7, D9, D10)
- D3: reject content keys carrying control/non-BMP characters, naming the key,
instead of silently dropping them on write (services create + update)
- D6: exclude versionless (non-instantiable) setups from search results so a
caller never sees an unusable version:null row
- D7a: populate loaded_functions when a tool is already loaded, so the result
is as verifiable as a fresh load
- D7b: enumerate the accepted action tags when load_manager receives an
out-of-union action, matching the CRUD managers
- D9/D10: compute search `truncated` on the rendered page and read limit+1 so
the flag means "a further usable row exists", not merely "the page is full"
Delete docker directory
Delete scripts directory
Feat/registry refactor
…it (DEV-670) Agno drains parallel member runs through a single asyncio.Queue, so two members streaming at once interleave their deltas on the wire. The adapter tracked one text-message slot and one reasoning slot for the whole stream, which spliced both speakers into a single bubble under a single name. Track both sequences per run, and carry AG-UI's subagent_run_id on every event a delegated run produces, so a client attributes output by id instead of matching a display name. - Surface delegations as SUBAGENT_STARTED / SUBAGENT_FINISHED / SUBAGENT_ERROR - Forward event metadata through to AG-UI, namespaced under "digitalkin" - Label a member's bubble with its author via TEXT_MESSAGE_START.name, replacing the "--- name ---" header previously injected into the message text - Close events carry the metadata of whoever opened the sequence, so a consumer filtering on parent_run_id keeps start and end together - A member's failure emits SUBAGENT_ERROR rather than RUN_ERROR, which AG-UI treats as terminal for the whole stream - Force-close every open message, reasoning block and delegation before RUN_FINISHED, which AG-UI rejects while any is still active Pins ag-ui-protocol to the dev build carrying subagent events and event-level metadata; move to >=0.1.21 once that ships stable. Bumps the dev version to 1.0.3.dev0.
feat(agno): sub-agent event labelling — release 1.0.3.dev0
…vice (DEV-686) Brings the SDK up to `agentic-mesh-protocol` at proto commit 0238092. Most of that branch already landed with the registry refactor; these are the fields and RPCs that were still being dropped on the floor. Filesystem gains the visibility scope it never carried: on the record, on uploads, on updates, and as a filter. Registry gains `tags` on modules and setups plus the `sort_by`/`descending` knobs, so a caller can order a page instead of taking whatever the backend hands back. `GetUserProfileResponse.mission_cost` rides on the response rather than the profile, and was being discarded by the proto-to-dict conversion; it is now folded into the dict callers already read. Storage records carry their service-assigned `storage_id`, and listing gained a record filter with limit/offset. Setup gains ListSetupVersions and SetCurrentSetupVersion, with the local strategy keeping a real version history so both are meaningful off-platform. UpdateSetup cuts a new version rather than editing one in place, so omitting `set_as_current` left the setup serving its old content. It is now sent, defaulting to true, which is what every existing caller already assumed. The agno registry toolkit also accepts the discriminated `action` union flattened or as a JSON string, since models routinely send both readings of a nested schema; a setup whose backing module the registry can no longer resolve is now deletable, while a transient registry error still fails closed. Adds version rollback to the kins manager. Requires agentic-mesh-protocol 1.0.1.dev5, which is not published yet: the pin makes every `uv`-based pre-commit hook unresolvable, so this was committed with --no-verify. `ruff check src/digitalkin` passes; `mypy src/digitalkin` reports 9 errors, all of them the new proto fields (storage_id, set_as_current, ListSetupVersions, …) missing from the older agentic-mesh-protocol currently installed in the local venv — they clear once dev5 is published and installed. fix(redis): enhance error handling and logging for Redis connectivity issues This update improves the resilience of the Redis client by explicitly setting socket timeouts and implementing retry logic for transient errors in the blocking pool. It also enhances logging to provide clearer diagnostics by specifying the type of Redis error encountered, aiding in troubleshooting. Additionally, the AgnoHitlRunner class has been updated to better manage tool resolution during continued runs, ensuring that tools are correctly restored after a pause. The changes include: - Added socket timeout configuration to Redis client settings. - Implemented retry logic for blocking Redis operations. - Enhanced error logging in the GatewayServicer to specify the type of Redis error. - Updated AgnoHitlRunner to handle tool resolution more effectively during continued runs. feat(module): implement mission-scoped persistence for dynamically loaded tools This update introduces a new mechanism to ensure that tools loaded at runtime persist across turns within the same mission, while preventing them from leaking into other missions. Key changes include: - Added `LoadedToolStore` to manage the persistence of loaded tool IDs in a mission-scoped storage collection. - Enhanced `ModuleContext` with methods to persist loaded tools and rehydrate them at the start of each mission turn. - Updated `ToolCache` to differentiate between declared and dynamically loaded tools, ensuring that dynamic loads are scoped to individual missions. - Refactored `LoadToolAction` to handle duplicate outcomes and conflicts more effectively during tool loading. These changes improve the reliability and isolation of tool loading in the agent's runtime environment. chore(release): bump version to 1.0.3
feat(services): track the tool-kin-registry protocol across every service (DEV-686)
xaviave
approved these changes
Sep 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.